/** @file
  The function declaration of policy entry operation in IpSecConfig application.

  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _POLICY_ENTRY_OPERATION_H_
#define _POLICY_ENTRY_OPERATION_H_

#define LOCAL              BIT(0)
#define REMOTE             BIT(1)
#define PROTO              BIT(2)
#define LOCAL_PORT         BIT(3)
#define REMOTE_PORT        BIT(4)
#define ICMP_TYPE          BIT(5)
#define ICMP_CODE          BIT(6)
#define NAME               BIT(7)
#define PACKET_FLAG        BIT(8)
#define ACTION             BIT(9)
#define EXT_SEQUENCE       BIT(10)
#define SEQUENCE_OVERFLOW  BIT(11)
#define FRAGMENT_CHECK     BIT(12)
#define LIFEBYTE           BIT(13)
#define LIFETIME_SOFT      BIT(14)
#define LIFETIME           BIT(15)
#define MODE               BIT(16)
#define TUNNEL_LOCAL       BIT(17)
#define TUNNEL_REMOTE      BIT(18)
#define DONT_FRAGMENT      BIT(19)
#define IPSEC_PROTO        BIT(20)
#define AUTH_ALGO          BIT(21)
#define ENCRYPT_ALGO       BIT(22)
#define SPI                BIT(23)
#define DEST               BIT(24)
#define SEQUENCE_NUMBER    BIT(25)
#define ANTIREPLAY_WINDOW  BIT(26)
#define AUTH_KEY           BIT(27)
#define ENCRYPT_KEY        BIT(28)
#define PATH_MTU           BIT(29)
#define SOURCE             BIT(30)

#define PEER_ID            BIT(0)
#define PEER_ADDRESS       BIT(1)
#define AUTH_PROTO         BIT(2)
#define AUTH_METHOD        BIT(3)
#define IKE_ID             BIT(4)
#define AUTH_DATA          BIT(5)
#define REVOCATION_DATA    BIT(6)

typedef struct {
  EFI_IPSEC_CONFIG_DATA_TYPE    DataType;
  EFI_IPSEC_CONFIG_SELECTOR     *Selector;    // Data to be inserted.
  VOID                          *Data;
  UINT32                        Mask;
  POLICY_ENTRY_INDEXER          Indexer;
  EFI_STATUS                    Status;       // Indicate whether insertion succeeds.
} EDIT_POLICY_ENTRY_CONTEXT;

typedef struct {
  EFI_IPSEC_CONFIG_DATA_TYPE    DataType;
  EFI_IPSEC_CONFIG_SELECTOR     *Selector;    // Data to be inserted.
  VOID                          *Data;
  POLICY_ENTRY_INDEXER          Indexer;
  EFI_STATUS                    Status;       // Indicate whether insertion succeeds.
} INSERT_POLICY_ENTRY_CONTEXT;

/**
  The prototype for the CreateSpdEntry()/CreateSadEntry()/CreatePadEntry().
  Fill in EFI_IPSEC_CONFIG_SELECTOR and corresponding data thru ParamPackage list.

  @param[out] Selector        The pointer to the EFI_IPSEC_CONFIG_SELECTOR union.
  @param[out] Data            The pointer to corresponding data.
  @param[in]  ParamPackage    The pointer to the ParamPackage list.
  @param[out] Mask            The pointer to the Mask.
  @param[in]  CreateNew       The switch to create new.

  @retval EFI_SUCCESS              Filled in EFI_IPSEC_CONFIG_SELECTOR and corresponding data successfully.
  @retval EFI_INVALID_PARAMETER    Invalid user input parameter.

**/
typedef
EFI_STATUS
(*CREATE_POLICY_ENTRY) (
  OUT EFI_IPSEC_CONFIG_SELECTOR    **Selector,
  OUT VOID                         **Data,
  IN  LIST_ENTRY                   *ParamPackage,
  OUT UINT32                       *Mask,
  IN  BOOLEAN                      CreateNew
  );

/**
  The prototype for the CombineSpdEntry()/CombineSadEntry()/CombinePadEntry().
  Combine old SPD/SAD/PAD entry with new SPD/SAD/PAD entry.

  @param[in, out] OldSelector    The pointer to the old EFI_IPSEC_CONFIG_SELECTOR union.
  @param[in, out] OldData        The pointer to the corresponding old data.
  @param[in]      NewSelector    The pointer to the new EFI_IPSEC_CONFIG_SELECTOR union.
  @param[in]      NewData        The pointer to the corresponding new data.
  @param[in]      Mask           The pointer to the Mask.
  @param[out]     CreateNew      The switch to create new.

  @retval EFI_SUCCESS              Combined successfully.
  @retval EFI_INVALID_PARAMETER    Invalid user input parameter.

**/
typedef
EFI_STATUS
(* COMBINE_POLICY_ENTRY) (
  IN OUT EFI_IPSEC_CONFIG_SELECTOR    *OldSelector,
  IN OUT VOID                         *OldData,
  IN     EFI_IPSEC_CONFIG_SELECTOR    *NewSelector,
  IN     VOID                         *NewData,
  IN     UINT32                       Mask,
     OUT BOOLEAN                      *CreateNew
  );

/**
  Insert or add entry information in database according to datatype.

  @param[in] DataType        The value of EFI_IPSEC_CONFIG_DATA_TYPE.
  @param[in] ParamPackage    The pointer to the ParamPackage list.

  @retval EFI_SUCCESS             Insert or add entry information successfully.
  @retval EFI_NOT_FOUND           Can't find the specified entry.
  @retval EFI_BUFFER_TOO_SMALL    The entry already existed.
  @retval EFI_UNSUPPORTED         The operation is not supported./
  @retval Others                  Some mistaken case.
**/
EFI_STATUS
AddOrInsertPolicyEntry (
  IN EFI_IPSEC_CONFIG_DATA_TYPE    DataType,
  IN LIST_ENTRY                    *ParamPackage
  );

/**
  Edit entry information in the database according to datatype.

  @param[in] DataType        The value of EFI_IPSEC_CONFIG_DATA_TYPE.
  @param[in] ParamPackage    The pointer to the ParamPackage list.

  @retval EFI_SUCCESS             Edit entry information successfully.
  @retval EFI_NOT_FOUND           Can't find the specified entry.
  @retval Others                  Some mistaken case.
**/
EFI_STATUS
EditPolicyEntry (
  IN EFI_IPSEC_CONFIG_DATA_TYPE    DataType,
  IN LIST_ENTRY                    *ParamPackage
  );
#endif
